﻿#define _CRT_SECURE_NO_WARNINGS 1
//#include<iostream>
//using namespace std;
//int main()
//{
//	const int a = 10;
//	// 编译报错：error C2440: “初始化”: ⽆法从“const int”转换为“int &”
//	// 这⾥的引⽤是对a访问权限的放⼤，a的权限从“仅可读”扩大到了“可读可写”
//	//int& ra = a;
//
//	//这样才可以
//	const int& ra = a;
//	// 编译报错：error C3892: “ra”: 不能给常量赋值
//	//ra++;
//
//	// 这⾥的引⽤是对b访问权限的缩⼩,b的权限从“可读可写”缩小到了“仅可读”
//	int b = 20;
//	const int& rb = b;
//	// 编译报错：error C3892: “rb”: 不能给常量赋值
//	//rb++;
//
//	return 0;
//}

//#include<iostream>
//using namespace std;
//int main()
//{
//	int a = 10;
//
//	// 编译报错: “初始化”: ⽆法从“int”转换为“int &”
//	//int& a = a * 3;
//
//	const int& ra = 20;//正确写法
//
//	double b = 3.14;
//
//	// 编译报错：“初始化”: ⽆法从“double”转换为“int &”
//	//int& rb = b;
//
//	const int& rb = b;//正确写法
//
//	return 0;
//}

//#include<iostream>
//using namespace std;
//
//inline int Add(int x, int y)
//{
//	int ret = x + y;
//	ret += 1;
//	ret += 1;
//	ret += 1;
//	ret += 1;
//	ret += 1;
//	ret += 1;
//	ret += 1;
//	ret += 1;
//	ret += 1;
//	return ret;
//}
//
//int main()
//{
//	// 可以通过汇编观察程序是否展开
//	// 有call Add语句就是没有展开，没有就是展开了
//	int ret = Add(1, 2);
//	cout << Add(1, 2) * 5 << endl;
//	return 0;
//}

//#include<iostream>
//using namespace std;
//// 实现⼀个ADD宏函数的常⻅问题
////#define ADD(int a, int b) return a + b;
////#define ADD(a, b) a + b;
////#define ADD(a, b) (a + b)
//
//
//// 正确的宏实现
//#define ADD(a, b) ((a) + (b))
//// 为什么不能加分号?
//// 为什么要加外⾯的括号?
//// 为什么要加⾥⾯的括号?
//
//int main()
//{
//	int ret = ADD(1, 2);
//
//	cout << ADD(1, 2) << endl; // 加分号：cout << ADD(1,2); << endl 或者 if(ADD(1,2);)会报错
//
//	cout << ADD(1, 2) * 5 << endl; // 不加外面括号：1 + 2*5  加外面括号：（1 + 2）*5
//
//	int x = 1, y = 2;
//
//	ADD(x & y, x | y); // -> (x&y+x|y) 优先级：+ 的优先级高于 &、|
//
//	return 0;
//}

//#include"F.h"
//
//int main()
//{
//	F(10);
//	return 0;
//}

#include<iostream>
using namespace std;
void f(int x)
{
	cout << "f(int x)" << endl;
}
void f(int* ptr)
{
	cout << "f(int* ptr)" << endl;
}
int main()
{
	f(0);

	// 本想通过f(NULL)调⽤指针版本的f(int*)函数，但是由于NULL被定义成0，调⽤了f(int x)，因此与程序的初衷相悖。
	f(NULL);
	f((int*)NULL);

	// 编译报错：error C2665: “f”: 2 个重载中没有⼀个可以转换所有参数类型
	// f((void*)NULL);
	
	f(nullptr);
	
	return 0;
}